﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using DBXml.Core;

namespace DBXml
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // Cria arquivos caso não existam, atualizar índice e tela.
            Store.Create();
            Store.CreateIndice();
            atualizarTela();
            for (int i = 0; i < dgvXml.ColumnCount; i++)
            {
                dgvXml.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
            }
        }

        private void btnAdicionar_Click(object sender, EventArgs e)
        {
            // Joga para aba "Campos" e coloca o "Id" como 0 que significa que irá adicionar um novo "Dado".
            tbcTela.SelectTab(tbpCampos);
            nudId.Value = 0;
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            // Joga para aba "Campos", verifica se foi selecionado algum "Dado" recupera seu "Id" e com isso chama "RecuperarDado(int) (DBXml.Core.Store)" para popular a tela.
            if (dgvXml.CurrentRow != null)
            {
                tbcTela.SelectTab(tbpCampos);
                int id = Convert.ToInt32(dgvXml.CurrentRow.Cells["id"].Value);
                XElement dado = Store.RecuperarDado(id);

                //Campos da aba "Campos"
                nudId.Value = id;
                nudNum.Value = Convert.ToInt32(dado.Attribute("numero").Value);
                txtNome.Text = dado.Attribute("nome").Value;
                if (Convert.ToChar(dado.Attribute("sexo").Value) == 'f')
                {
                    rbtnSexof.Checked = true;
                    rbtnSexom.Checked = false;
                }
                else
                {
                    rbtnSexof.Checked = false;
                    rbtnSexom.Checked = true;
                }
                txtTel.Text = dado.Attribute("telefone").Value;
                txtEnd.Text = dado.Attribute("endereco").Value;
                txtCid.Text = dado.Attribute("cidade").Value;
                txtEst.Text = dado.Attribute("estado").Value;
            }
        }

        private void btnPesquisar_Click(object sender, EventArgs e)
        {
            // Chama a função "Search(DBXml.Constants.TipoOrdenacao, string, decimal) (DBXml.Core.Store)" responsável por filtrar e ordenar o índice e atualizar a tela.
            if (txtFiltroNome.Text.Trim() != "" && nudFiltroNumero.Value != 0)
            {
                MessageBox.Show("Só é possível pesquisar um por vez!");
                return;
            }
            Store.CreateIndice();
            atualizarTela();
            Constants.TipoOrdenacao tipoOrdenacao;
            if (rbtnSortNome.Checked)
            {
                tipoOrdenacao = Constants.TipoOrdenacao.Nome;
            }
            else
            {
                tipoOrdenacao = Constants.TipoOrdenacao.Numero;
            }
            Store.Search(tipoOrdenacao, txtFiltroNome.Text, nudFiltroNumero.Value);
            atualizarTela();
            limparCamposFiltro();
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            // Faz validação dos campos obrigatórios, a adiciona ou atualizar um "Dado" chamando a função "Add(System.Xml.Linq.XElement) (DBXml.Core.Store)"
            // Atualzia a tela e joga para aba "Buscar"
            string msgCamposObrigatorio = "";
            if (nudNum.Value == 0) { msgCamposObrigatorio += "\nNúmero do cliente."; }
            if (txtNome.Text.Trim() == "") { msgCamposObrigatorio += "\nNome."; }
            if (txtEnd.Text.Trim() == "") { msgCamposObrigatorio += "\nEndereço."; }
            if (txtCid.Text.Trim() == "") { msgCamposObrigatorio += "\nCidade."; }
            if (txtEst.Text.Trim() == "") { msgCamposObrigatorio += "\nEstado."; }

            if (msgCamposObrigatorio != "")
            {
                MessageBox.Show("Informe valores para os campos:" + msgCamposObrigatorio);
            }
            else
            {
                // Criando os dados completo
                XElement newDado = new XElement("Dado");
                newDado.Add(new XAttribute("id",  nudId.Value));
                newDado.Add(new XAttribute("nome", txtNome.Text));
                newDado.Add(new XAttribute("sexo", rbtnSexof.Checked ? 'f' : 'm'));
                newDado.Add(new XAttribute("numero", nudNum.Value));
                newDado.Add(new XAttribute("telefone", txtTel.Text));
                newDado.Add(new XAttribute("endereco", txtEnd.Text));
                newDado.Add(new XAttribute("cidade", txtCid.Text));
                newDado.Add(new XAttribute("estado", txtEst.Text));
                Store.Add(newDado);

                Store.CreateIndice();
                atualizarTela();

                limparCampos();
                tbcTela.SelectTab(tbpBuscar);
                MessageBox.Show("Salvo com sucesso!");
            }
        }

        /// <summary> Cria o indice de acordo com os "Dado" e atualiza a tela.</summary>
        private void atualizarTela()
        {
            
            DataSet dsXML = new DataSet();
            dsXML.ReadXml(Store.locationIndice);
            dgvXml.DataSource = dsXML.Tables["Dado"];
        }

        /// <summary>Limpa dos os campos.</summary>
        private void limparCampos()
        {
            nudId.Value = decimal.Zero;
            nudNum.Value = decimal.Zero;
            txtNome.Text = null;
            rbtnSexof.Checked = true;
            txtTel.Text = null;
            txtEnd.Text = null;
            txtCid.Text = null;
            txtEst.Text = null;
            txtFiltroNome.Text = null;
            nudFiltroNumero.Value = decimal.Zero;
        }
        private void limparCamposFiltro()
        {
            txtFiltroNome.Text = "";
            nudFiltroNumero.Value = decimal.Zero;
        }

        private void btnDeletar_Click(object sender, EventArgs e)
        {
            // verifica se foi selecionado algum "Dado" recupera seu "Id" e "Nome", chama a função "Deletar(int) (DBXml.Core.Store)" para deleta o "Dado", e atualiza a tela.
            if (dgvXml.CurrentRow != null)
            {
                int id = Convert.ToInt32(dgvXml.CurrentRow.Cells["id"].Value);
                if (MessageBox.Show("Deseja deletar \"" + dgvXml.CurrentRow.Cells["nome"].Value + "\" ?", "Deletar", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    Store.Deletar(id);
                    MessageBox.Show("Deletado com sucesso!");
                    Store.CreateIndice();
                    atualizarTela();
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

    }
}
